/*
 * Proyecto Manejador de Proyectos
 * @Autor Hector Hurtado
 */
package Mproyectos.controladores;

import Mproyectos.entidades.PalabraClave;
import Mproyectos.entidades.Proyecto;
import Mproyectos.modelo.FachadaPalabraClave;
import Mproyectos.modelo.FachadaProyecto;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 * Controla el las transacciones de busqueda de la entidad proyecto.
 */
@ManagedBean(name = "controlProyectoPrestamo")
@SessionScoped
public class ControlProyectoPrestamo implements Serializable {

    /**
     * Se añade la letra B al final de la variable para indicar que se utlizan
     * en la busqueda del proyecto
     */
    /**
     * Proyecto en Busqueda o Visualizacion
     */
    private Proyecto proyecto;
    /**
     * Nombre de Programa para la busqueda
     */
    private String nombrePrograma;
    /**
     * Año para la busqueda
     */
    private int anioB = 1900;
    /**
     * semestre para la busqueda
     */
    private String semestreB = "I";
    /**
     * Palabra Clave en creación, para buscar el proyecto.
     *
     */
    private PalabraClave palabraClaveB;
    /**
     * Arreglo de palabras clave, para adicionar al proyecto.
     *
     */
    private Collection<PalabraClave> palabrasClaveB;
    /**
     *
     * Fachada de acceso a los datos de la palabra clave
     */
    @EJB
    private FachadaPalabraClave fachadaPalabraClaveB;
    /**
     * Palabra clave para la busqueda
     */
    private String operador = "";
    /**
     * Lista de operadores para la busqueda
     */
    private ArrayList<String> operadores;
    /**
     * Lista de proyectos encontrados
     */
    private Collection<Proyecto> proyectosResultado;
    /*
     * contador de renglones para la busqueda por palabrasa clave
     */
    @EJB
    private FachadaProyecto fachadaProyecto;

    /**
     * Constructor vacio
     */
    public ControlProyectoPrestamo() {
    }

    /**
     * Devuelve el Proyecto que se esta buscando
     *
     * @return Proyecto a crear o actualizar
     */
    public Proyecto getProyecto() {

        // Retorna el Proyecto actual
        return proyecto;
    }

    /**
     * Asigna el Proyecto especificado como el Proyecto actual y llama a la
     * pagina de visualizacion
     *
     * @param Proyecto a visualizar
     * @return devuelve a la pagina de visualizacion
     */
    public String zoomProyecto(Proyecto proyecto) {
        // Asigna el Proyecto seleccionado desde la lista como  el actual
        this.setProyecto(proyecto);
        return "proyecto";
    }

    /**
     * Abre la pagina de resultados por programa
     *
     * @return va a la lista de proyectos por programa
     */
    public String buscarPrograma() {
        this.setProyectosResultado(this.getFachadaProyecto().
                listarPorPrograma(getNombrePrograma()));
        return "proyectosResultados";
    }

    /**
     * Abre la pagina de resultados por periodo
     *
     * @return va a la lista de proyectos por periodo
     */
    public String buscarPeriodo() {
        System.out.println("Buscar " + getAnioB());
        this.setProyectosResultado(this.getFachadaProyecto().
                listarPorPeriodo(getAnioB(), getSemestreB()));
        return "proyectosResultados";
    }

    /**
     * Abre la pagina con los resultados de la busqueda por palabras clave.
     *
     * @return va a la lista de proyectos por periodo
     */
    public String buscarPalabrasClave() {
        String sentencia = "";
        for (PalabraClave a : palabrasClaveB) {
            sentencia += a.getPalabra();
            if (!getOperadores().isEmpty()) {
                sentencia += " " + getOperadores().remove(0) + " ";
            }
        }
        System.out.println(sentencia);

        this.setProyectosResultado(this.getFachadaProyecto().listarPorPalabrasClave(sentencia));
        return "proyectosResultados";
    }

    /*
     * lista de  años para la seleccion.
     * tanto para busqueda o el registro, .
     * @return the ArrayList de años
     */
    public ArrayList<Integer> listaAños() {
        ArrayList<Integer> años = new ArrayList();
        Calendar c = Calendar.getInstance();
        int año = c.get(Calendar.YEAR);

        while (año != 1960) {
            años.add(año);
            año--;
        }
        return años;
    }
    /*
     * lista de  semestres para la seleccion.
     * tanto para busqueda o el registro, .
     * @return the ArrayList de semestres
     */

    public ArrayList<String> listaSemestres() {
        ArrayList<String> semestres = new ArrayList();
        semestres.add("I");
        semestres.add("II");
        semestres.add("III");
        return semestres;
    }

    /**
     * Proyecto en Busqueda o Visualizacion
     *
     * @param proyecto the proyectoB to set
     */
    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    /**
     * Nombre de Programa para la busqueda
     *
     * @return the nombrePrograma
     */
    public String getNombrePrograma() {
        return nombrePrograma;
    }

    /**
     * Nombre de Programa para la busqueda
     *
     * @param nombrePrograma the nombrePrograma to set
     */
    public void setNombrePrograma(String nombrePrograma) {
        this.nombrePrograma = nombrePrograma;
    }

    /**
     * Año para la busqueda
     *
     * @return the anioB
     */
    public int getAnioB() {
        return anioB;
    }

    /**
     * Año para la busqueda
     *
     * @param anioB the anioB to set
     */
    public void setAnioB(int anioB) {

        this.anioB = anioB;
    }

    /**
     * semestre para la busqueda
     *
     * @return the semestreB
     */
    public String getSemestreB() {
        return semestreB;
    }

    /**
     * semestre para la busqueda
     *
     * @param semestreB the semestreB to set
     */
    public void setSemestreB(String semestreB) {
        this.semestreB = semestreB;
    }

    /**
     * Lista de proyectos encontrados
     *
     * @return the proyectosResultado
     */
    public Collection<Proyecto> getProyectosResultado() {
        return proyectosResultado;
    }

    /**
     * Lista de proyectos encontrados
     *
     * @param proyectosResultado the proyectosResultado to set
     */
    public void setProyectosResultado(Collection<Proyecto> proyectosResultado) {
        this.proyectosResultado = proyectosResultado;
    }

    /**
     * Fachada de acceso a los datos
     *
     * @return the fachadaProyecto
     */
    public FachadaProyecto getFachadaProyecto() {
        return fachadaProyecto;
    }

    /**
     * Fachada de acceso a los datos
     *
     * @param fachadaProyecto the fachadaProyecto to set
     */
    public void setFachadaProyecto(FachadaProyecto fachadaProyecto) {
        this.fachadaProyecto = fachadaProyecto;
    }

    /**
     * @return the palabraClave
     */
    public PalabraClave getPalabraClave() {
        if (palabraClaveB == null) {
            palabraClaveB = new PalabraClave();
        }
        return palabraClaveB;
    }

    /**
     * @param palabraClave the palabraClave to set
     */
    public void setPalabraClave(PalabraClave palabraClave) {
        this.palabraClaveB = palabraClave;
    }

    /**
     * @return the palabrasClave
     */
    public Collection<PalabraClave> getPalabrasClave() {
        if (palabrasClaveB == null) {
            palabrasClaveB = new ArrayList();
            this.getPalabraClave().setPalabra(" ");
            palabrasClaveB.add(palabraClaveB);
        }
        return palabrasClaveB;
    }

    /**
     * @param palabrasClave the palabrasClave to set
     */
    public void setPalabrasClave(Collection<PalabraClave> palabrasClave) {
        this.palabrasClaveB = palabrasClave;
    }

    /**
     * @return the operador
     */
    public String getOperador() {
        if (operador == null) {
            operador = "AND";
        }

        return operador;
    }

    /**
     * @param operador the operador to set
     */
    public void setOperador(String operador) {
        this.operador = operador;
    }

    /**
     * @return the operadores
     */
    public ArrayList<String> getOperadores() {
        if (operadores == null) {
            operadores = new ArrayList();
            // operadores.add("And");
        }
        return operadores;
    }

    /**
     * @param operadores the operadores to set
     */
    public void setOperadores(ArrayList<String> operadores) {
        this.operadores = operadores;
    }

    /**
     * @return the fachadaPalabraClave
     */
    public FachadaPalabraClave getFachadaPalabraClave() {
        return fachadaPalabraClaveB;
    }

    /**
     * @param fachadaPalabraClave the fachadaPalabraClave to set
     */
    public void setFachadaPalabraClave(FachadaPalabraClave fachadaPalabraClave) {
        this.fachadaPalabraClaveB = fachadaPalabraClave;
    }

    /*
     * lista de  operadores para la seleccion.
     *  para busqueda 
     * @return the ArrayList de operadores
     */
    public ArrayList<String> listaOperadores() {
        ArrayList<String> listaOperadores = new ArrayList();
        listaOperadores.add("AND");
        listaOperadores.add("OR");
        listaOperadores.add("NOT");
        return listaOperadores;
    }

    /**
     * Adiciona a la colección de operadores del Proyecto actual el operador
     * seleccioado
     *
     * @return void
     */
    public void addRenglon() {
        /*
         * Adiciona la palabra Clave al una colletion para luego adicionar 
         * esta al proyecto
         */
        //getPalabrasClave().add(palabraClaveB);

        this.operadores.add(operador);

        this.setPalabraClave(null);
        this.setOperador(null);
        this.getPalabraClave().setPalabra(" ");
        this.getPalabrasClave().add(palabraClaveB);

        //this.getOperadores().add(" ");
    }
}